import java.util.*;

/**
 * LoadBalancer类用于实现一个简单的负载均衡器
 * 它使用单例模式来确保只有一个实例存在，以提供统一的服务器访问接口
 */
public class LoadBalancer {
    // 静态私有实例，确保只有一个实例存在
    private volatile static LoadBalancer instance = null;
    // 保存服务器列表
    private static final List<Server> serverList = new ArrayList<>();

    // 私有构造函数，防止外部实例化
    private LoadBalancer() {}

    /**
     * 获取LoadBalancer单例实例的方法
     * 使用双重校验锁来确保在实例未被创建时同步地创建，并在实例创建后无锁访问
     *
     * @return LoadBalancer的单例实例
     */
    public static LoadBalancer getLoadBalancer() {
        if (instance == null) {
            synchronized (LoadBalancer.class) {
                if (instance == null) {
                    instance = new LoadBalancer();
                }
            }
        }
        return instance;
    }

    /**
     * 向负载均衡器中添加服务器
     *
     * @param server 要添加的服务器实例
     */
    public void addServer(Server server) {
        serverList.add(server);
    }

    /**
     * 根据服务器的当前连接数来选择一个服务器
     * 返回连接数最少的服务器，以实现简单的负载均衡
     * 如果没有服务器，则返回null
     *
     * @return 连接数最少的服务器实例，如果没有服务器则返回null
     */
    public Server getServer() {
        if (!serverList.isEmpty()) {
            return Collections.min(serverList, Comparator.comparingInt(Server::getConnections));
        }
        return null;
    }

    /**
     * 从负载均衡器中移除指定IP的服务器
     *
     * @param IP 要移除的服务器的IP地址
     */
    public void removeServer(String IP) {
        Iterator<Server> iterator = serverList.iterator();
        while (iterator.hasNext()) {
            Server server = iterator.next();
            if (server.getIP().equals(IP)) {
                iterator.remove();
                break;
            }
        }
    }

    public List<Server> getServerList() {
        return serverList;
    }
}
